<?php
namespace app\common\service;
use Firebase\JWT\ExpiredException;
use Firebase\JWT\JWT;

class JwtAuth
{
    const Key = "49b22f904112e6a837e38222e99dd32a";
    const Iss = "541720500@qq.com";
    const Exp = 168; // 小时过期 一周
    const Username = 'email'; // 用户名字段名
    const Password = 'password'; // 密码字段名


    public static function getToken($payload = [])
    {
        if (empty($payload)) {
            exception('缺少生成签名参数');
        }
        $now = time();
//        $payload = array_merge(self::encryptPayload($payload), [
//            'typ' => 'JWT',
//            'alg' => 'HS256',
//            'iss' => self::Iss,
//            'iat' => $now,
//            'exp' => $now + self::Exp * 3600,
//        ]);
        $payload = [
            'typ' => 'JWT',
            'alg' => 'HS256',
            'iss' => self::Iss,
            'iat' => $now,
            'exp' => $now + self::Exp * 3600,
            'data' => self::encryptPayload($payload)
        ];
        return JWT::encode($payload, self::Key);
//  header
//  jwt的头部承载两部分信息：
//  声明类型，这里是jwt
//  声明加密的算法 通常直接使用 HMAC SHA256
//  playload 载荷就是存放有效信息的地方
//  iss: jwt签发者
//  sub: jwt所面向的用户
//  aud: 接收jwt的一方
//  exp: jwt的过期时间，这个过期时间必须要大于签发时间
//  nbf: 定义在什么时间之前，该jwt都是不可用的.
//  iat: jwt的签发时间
//  jti: jwt的唯一身份标识，主要用来作为一次性token, 从而回避重放攻击。
//        echo $token = JWT::encode($payload, self::Key);
//        echo PHP_EOL;
//        $result = JWT::decode($token, self::Key, array('HS256'));
//        var_dump($result);
    }
    private static function encryptPayload($payload)
    {
        return do_encrypt($payload);
    }
    private static function decryptPayload($token_data)
    {
        return do_decrypt($token_data);
    }
    public static function checkToken($token)
    {
        if ($token == false) {
            exception('缺少Token');
        }
        try{
            $payload = JWT::decode($token, self::Key, ['HS256']);
            return self::decryptPayload($payload->data);
        } catch (\Exception $e) {
            if($e instanceof ExpiredException) {
                exception('签名过期!!!');
            } else {
                exception($e->getMessage());
            }
        }
    }

}